/***********************************************************************************
** MIT License                                                                    **
**                                                                                **
** Copyright (c) 2018 Victor DENIS (victordenis01@gmail.com)                      **
**                                                                                **
** Permission is hereby granted, free of charge, to any person obtaining a copy   **
** of this software and associated documentation files (the "Software"), to deal  **
** in the Software without restriction, including without limitation the rights   **
** to use, copy, modify, merge, publish, distribute, sublicense, and/or sell      **
** copies of the Software, and to permit persons to whom the Software is          **
** furnished to do so, subject to the following conditions:                       **
**                                                                                **
** The above copyright notice and this permission notice shall be included in all **
** copies or substantial portions of the Software.                                **
**                                                                                **
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR     **
** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,       **
** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE    **
** AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER         **
** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  **
** OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  **
** SOFTWARE.                                                                      **
***********************************************************************************/

#pragma once
#ifndef SIELOBROWSER_ADBMATCHER_HPP
#define SIELOBROWSER_ADBMATCHER_HPP

#include "SharedDefines.hpp"

#include <QObject>

#include <QVector>

#include <QUrl>

#include <QWebEngine/UrlRequestInfo.hpp>

#include "AdBlock/SearchTree.hpp"

namespace Sn {
namespace ADB {
class Manager;

class Rule;

class SIELO_SHAREDLIB Matcher : public QObject {
Q_OBJECT

public:
	Matcher(Manager* manager);
	~Matcher();

	const Rule* match(const Engine::UrlRequestInfo& request, const QString& urlDomain,
					  const QString& urlString) const;

	bool adBlockDisabledForUrl(const QUrl& url) const;
	bool elementHideDisabledForUrl(const QUrl& url) const;

	QString elementHidingRules() const;
	QString elementHidingRulesForDomain(const QString& domain) const;

public slots:
	void update();
	void clear();

private slots:
	void enabledChanged(bool enabled);

private:
	Manager* m_manager{nullptr};

	QVector<Rule*> m_createdRules;
	QVector<const Rule*> m_networkExceptionRules;
	QVector<const Rule*> m_networkBlockRules;
	QVector<const Rule*> m_domainRestrictedCssRules;
	QVector<const Rule*> m_documentRules;
	QVector<const Rule*> m_elementHideRules;

	QString m_elementHidingRules{};
	SearchTree m_networkBlockTree{};
	SearchTree m_networkExceptionTree{};
};

}
}

#endif //SIELOBROWSER_ADBMATCHER_HPP
